/*
 *  Лицензия MIT
 * 
 *  Copyright 2011 Salnikov Aleksey.
 * 
 *  Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного обеспечения
 *  и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
 *  использовать Программное Обеспечение без ограничений, включая неограниченное право
 *  на использование, копирование, изменение, объединение, публикацию, распространение,
 *  сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам,
 *  которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
 * 
 *  Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые
 *  части данного Программного Обеспечения.
 * 
 *  ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
 *  ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
 *  СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ
 *  НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ
 *  ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ
 *  С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
 *  ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */

package look.elements.admin;

import CommonTools.Actions;
import CommonTools.Admin;
import CommonTools.Constants;
import CommonTools.DesignTools;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

/**
 * Класс правой панели, для отображения информации об администраторе
 *
 * @author Salnikov Aleksey
 */
public class RightPanel extends JPanel {

    JLabel nameL, famL, otchL, telL, pasL, logL, mailL;
    JTextField nameF, famF, otchF, telF, logF, mailF;
    JPasswordField pasF;
    JCheckBox showPassCB, rootCb;
    JButton saveB, refreshB;
    Admin admin;
    LeftPanel lp;
    char enabled = '•', disabled = '\0';

    public RightPanel()
    {
        /***************************************
         * Инициализация всех компонентов
         **************************************/
        nameL = new JLabel("Имя:");
        famL = new JLabel("Фамилия:");
        otchL = new JLabel("Отчество:");
        telL = new JLabel("Телефон:");
        pasL = new JLabel("Пароль:");
        logL = new JLabel("Логин:");
        mailL = new JLabel("E-mail:");

        nameF = new JTextField();
        nameF.setForeground(Constants.NORMAL_COLOR);
        famF = new JTextField();
        famF.setForeground(Constants.NORMAL_COLOR);
        otchF = new JTextField();
        otchF.setForeground(Constants.NORMAL_COLOR);
        telF = new JTextField();
        telF.setForeground(Constants.NORMAL_COLOR);
        logF = new JTextField();
        logF.setForeground(Constants.NORMAL_COLOR);
        mailF = new JTextField();
        mailF.setForeground(Constants.NORMAL_COLOR);
        pasF = new JPasswordField();
        pasF.setForeground(Constants.NORMAL_COLOR);

        showPassCB = new JCheckBox("Отобразить пароль");
        pasF.setEchoChar(enabled);

        rootCb = new JCheckBox("Суперадминистратор");

        /*****************************************
         * Настройка менеджера компоновки
         ****************************************/
        GridBagLayout gbl = new GridBagLayout();
        gbl.rowWeights = new double [] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0};
        gbl.columnWeights = new double [] {0.0, 1.0, Double.MIN_VALUE};
        gbl.rowHeights = new int [] {0,0,0,0,0,0,0,0,0,0,1};
        gbl.columnWidths = new int [] {2};

        this.setLayout(gbl);

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(3,10,0,10);
        gbc.weighty = 0.0;

        /****************************************
         * Расстановка компонентов
         ***************************************/
        gbc.anchor = gbc.NORTHWEST;
        gbc.fill = gbc.NONE;
        gbc.gridx = 0;
        gbc.gridy = 0;

        this.add(nameL, gbc);

        gbc.gridy = 1;
        this.add(famL, gbc);

        gbc.gridy = 2;
        this.add(otchL, gbc);

        gbc.gridy = 3;
        this.add(logL, gbc);

        gbc.gridy = 4;
        this.add(pasL, gbc);

        gbc.gridy = 6;
        this.add(telL, gbc);

        gbc.gridy = 7;
        this.add(mailL, gbc);

        gbc.fill = gbc.HORIZONTAL;
        gbc.insets = new Insets(0,10,0,10);
        gbc.gridx = 1;
        gbc.gridy = 0;

        this.add(nameF, gbc);

        gbc.gridy = 1;
        this.add(famF, gbc);

        gbc.gridy = 2;
        this.add(otchF, gbc);

        gbc.gridy = 3;
        this.add(logF, gbc);

        gbc.gridy = 4;
        this.add(pasF, gbc);

        gbc.gridy = 5;
        this.add(showPassCB, gbc);

        gbc.gridy = 6;
        this.add(telF, gbc);

        gbc.gridy = 7;
        this.add(mailF, gbc);

        gbc.gridy = 8;
        this.add(rootCb, gbc);

        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        saveB = new JButton("Сохранить");
        refreshB = new JButton("Отмена");

        buttonPanel.add(refreshB);
        buttonPanel.add(saveB);

        gbc.gridy = 9;
        this.add(buttonPanel, gbc);

        /************************************************
         * Привязываем события
         ***********************************************/
        showPassCB.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    if (showPassCB.isSelected())
                        pasF.setEchoChar(disabled);
                    else
                        pasF.setEchoChar(enabled);
                }
            });

        refreshB.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    showAdmin(admin);
                }
            });

        saveB.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    editAdmin();
                }
            });

       /***********************************************
         * Вешаем слушателей событий (счетчики короче)
         **********************************************/
        //JTextField nameF, famF, otchF, telF, logF, mailF;
        //JPasswordField pasF;
        nameF.addKeyListener(new KeyAdapter()
            {
                @Override
                public void keyPressed(KeyEvent e)
                {
                    if (nameF.getText().length() > 19)
                        nameF.setForeground(Constants.ERROR_COLOR);
                    else
                        nameF.setForeground(Constants.NORMAL_COLOR);
                }
            });
        famF.addKeyListener(new KeyAdapter()
            {
                @Override
                public void keyPressed(KeyEvent e)
                {
                    if (famF.getText().length() > 19)
                        famF.setForeground(Constants.ERROR_COLOR);
                    else
                        famF.setForeground(Constants.NORMAL_COLOR);
                }
            });
        otchF.addKeyListener(new KeyAdapter()
            {
                @Override
                public void keyPressed(KeyEvent e)
                {
                    if (otchF.getText().length() > 19)
                        otchF.setForeground(Constants.ERROR_COLOR);
                    else
                        otchF.setForeground(Constants.NORMAL_COLOR);
                }
            });
        mailF.addKeyListener(new KeyAdapter()
            {
                @Override
                public void keyPressed(KeyEvent e)
                {
                    if (mailF.getText().length() > 49)
                        mailF.setForeground(Constants.ERROR_COLOR);
                    else
                        mailF.setForeground(Constants.NORMAL_COLOR);
                }
            });
        logF.addKeyListener(new KeyAdapter()
            {
                @Override
                public void keyPressed(KeyEvent e)
                {
                    if (logF.getText().length() > 19)
                        logF.setForeground(Constants.ERROR_COLOR);
                    else
                        logF.setForeground(Constants.NORMAL_COLOR);
                }
            });
        telF.addKeyListener(new KeyAdapter()
            {
                @Override
                public void keyPressed(KeyEvent e)
                {
                    if (telF.getText().length() > 19)
                        telF.setForeground(Constants.ERROR_COLOR);
                    else
                        telF.setForeground(Constants.NORMAL_COLOR);
                }
            });
        pasF.addKeyListener(new KeyAdapter()
            {
                @Override
                public void keyPressed(KeyEvent e)
                {
                    if (pasF.getText().length() > 19)
                        pasF.setForeground(Constants.ERROR_COLOR);
                    else
                        pasF.setForeground(Constants.NORMAL_COLOR);
                }
            });

    }

    /**
     * Процедура отображения информации об 
     * администраторе
     *
     * @param
     */
    public void showAdmin(Admin admin)
    {
        try
        {
            this.admin = admin;
            nameF.setText(admin.getName());
            famF.setText(admin.getFam());
            otchF.setText(admin.getOtch());
            telF.setText(admin.getPhone());
            logF.setText(admin.getLogin());
            mailF.setText(admin.getMail());
            pasF.setText(admin.getPassword());
            rootCb.setSelected(admin.isRoot());
        }
        catch (Exception e)
        {
            nameF.setText("");
            famF.setText("");
            otchF.setText("");
            telF.setText("");
            logF.setText("");
            mailF.setText("");
            pasF.setText("");
            rootCb.setSelected(false);
        }
    }

    /**
     * Процедура редактирвоания администратора
     */
    public void editAdmin()
    {
        //Если что-то есть
        if (admin != null)
        {
            int root;

            if (this.rootCb.isSelected())
                root = 1;
            else
                root = 0;

            if (nameF.getForeground().equals(Constants.NORMAL_COLOR) &&
            famF.getForeground().equals(Constants.NORMAL_COLOR) &&
            logF.getForeground().equals(Constants.NORMAL_COLOR) &&
            pasF.getForeground().equals(Constants.NORMAL_COLOR) &&
            otchF.getForeground().equals(Constants.NORMAL_COLOR) &&
            mailF.getForeground().equals(Constants.NORMAL_COLOR) &&
            telF.getForeground().equals(Constants.NORMAL_COLOR))

                //Если логин администратора не был изменен, или изменен, но такого еще не существует
                if (admin.getLogin().equals(logF.getText()) || !Actions.isAdminThere(logF.getText()))
                {
                    Actions.editAdmin(admin.getId(), nameF.getText(), famF.getText(), otchF.getText(), logF.getText(), pasF.getText(), root, mailF.getText(), telF.getText());
                    Actions.refreshAdminList(lp.adminsL);
                }
                else
                    DesignTools.showMessage("Ошибка", "Администратор с таким логином уже существует", true);
            else
                DesignTools.showMessage("Ошибка", "Администратор не создан\n"
                    + "Если в каком-то из полей текст красного цвета,\n"
                    + "то сократите текст, пока он не станет черным.", true);
        }
    }

    public void setLeftPanel(LeftPanel lp)
    {
        this.lp = lp;
    }

}
